#include "gamewindows.h"
#include <QPainter>
#include <QKeyEvent>
#include <cstdlib>
#include <ctime>

// 构造函数，初始化游戏窗口及相关变量
GameWindow::GameWindow(QWidget *parent)
    : QWidget(parent), planeX(400), planeY(500), left(false), right(false), up(false), down(false), score(0), gamePaused(false) {
    srand(time(nullptr));  // 设置随机数种子
    timer = new QTimer(this);  // 创建定时器，用于更新游戏
    connect(timer, &QTimer::timeout, this, &GameWindow::updateGame);  // 连接定时器的超时信号到updateGame槽
    timer->start(16);  // 每16毫秒触发一次定时器

    spawnTimer = new QTimer(this);  // 创建定时器，用于生成敌人
    connect(spawnTimer, &QTimer::timeout, this, &GameWindow::spawnEnemy);  // 连接定时器的超时信号到spawnEnemy槽
    spawnTimer->start(2000);  // 每2秒触发一次定时器

    startGame();  // 开始游戏
}

// 析构函数，释放定时器资源
GameWindow::~GameWindow() {
    delete timer;
    delete spawnTimer;
}

// 重写绘制事件
void GameWindow::paintEvent(QPaintEvent *event) {
    QPainter painter(this);  // 创建QPainter对象
    if (gamePaused) {  // 如果游戏暂停
        painter.drawText(rect(), Qt::AlignCenter, "Game Paused! Press P to Resume.");  // 显示暂停提示信息
        return;
    }
    if (!timer->isActive()) {  // 如果定时器未激活，即游戏结束
        painter.drawText(rect(), Qt::AlignCenter, "Game Over! Press R to Restart.");  // 显示游戏结束提示信息
        return;
    }

    painter.setBrush(Qt::blue);  // 设置画刷颜色为蓝色
    painter.drawRect(planeX, planeY, 50, 50);  // 绘制飞机

    painter.setBrush(Qt::red);  // 设置画刷颜色为红色
    for (const auto &enemy : enemies) {
        painter.drawRect(enemy.x, enemy.y, 50, 50);  // 绘制每个敌人
    }

    painter.setBrush(Qt::green);  // 设置画刷颜色为绿色
    for (const auto &bullet : bullets) {
        painter.drawRect(bullet.x, bullet.y, 10, 20);  // 绘制每颗子弹
    }

    painter.setPen(Qt::black);  // 设置画笔颜色为黑色
    painter.drawText(10, 20, QString("Score: %1").arg(score));  // 显示分数
}

// 重写键盘按下事件
void GameWindow::keyPressEvent(QKeyEvent *event) {
    switch (event->key()) {
    case Qt::Key_Left:
        left = true;
        break;
    case Qt::Key_Right:
        right = true;
        break;
    case Qt::Key_Up:
        up = true;
        break;
    case Qt::Key_Down:
        down = true;
        break;
    case Qt::Key_Space:
        if (!gamePaused && timer->isActive()) {
            bullets.push_back(Bullet(planeX + 20, planeY));  // 按空格键发射子弹
        }
        break;
    case Qt::Key_P:
        if (gamePaused) {
            startGame();  // 按P键恢复游戏
        } else {
            pauseGame();  // 按P键暂停游戏
        }
        break;
    case Qt::Key_R:
        resetGame();  // 按R键重置游戏
        break;
    default:
        QWidget::keyPressEvent(event);
    }
}

// 重写键盘释放事件
void GameWindow::keyReleaseEvent(QKeyEvent *event) {
    switch (event->key()) {
    case Qt::Key_Left:
        left = false;
        break;
    case Qt::Key_Right:
        right = false;
        break;
    case Qt::Key_Up:
        up = false;
        break;
    case Qt::Key_Down:
        down = false;
        break;
    default:
        QWidget::keyReleaseEvent(event);
    }
}

// 更新游戏状态
void GameWindow::updateGame() {
    if (gamePaused) return;  // 如果游戏暂停，则不更新

    // 根据方向标志移动飞机
    if (left && planeX > 0) planeX -= 5;
    if (right && planeX < width() - 50) planeX += 5;
    if (up && planeY > 0) planeY -= 5;
    if (down && planeY < height() - 50) planeY += 5;

    // 移动敌人
    for (auto &enemy : enemies) {
        enemy.move();
    }

    // 移动子弹
    for (auto it = bullets.begin(); it != bullets.end(); ) {
        it->move();
        if (it->y < 0) {
            it = bullets.erase(it);  // 移除超出边界的子弹
        } else {
            ++it;
        }
    }

    // 检查子弹和敌人的碰撞
    for (auto enemyIt = enemies.begin(); enemyIt != enemies.end(); ) {
        bool hit = false;
        for (auto bulletIt = bullets.begin(); bulletIt != bullets.end(); ) {
            if (checkCollision(enemyIt->x, enemyIt->y, 50, 50, bulletIt->x, bulletIt->y, 10, 20)) {
                enemyIt = enemies.erase(enemyIt);  // 移除被击中的敌人
                bulletIt = bullets.erase(bulletIt);  // 移除击中敌人的子弹
                hit = true;
                score += 10;  // 增加分数
                break;
            } else {
                ++bulletIt;
            }
        }
        if (!hit) {
            if (checkCollision(enemyIt->x, enemyIt->y, 50, 50, planeX, planeY, 50, 50)) {
                timer->stop();  // 停止游戏
                spawnTimer->stop();
                return;
            }
            ++enemyIt;
        }
    }

    update();  // 更新界面
}

// 生成敌人
void GameWindow::spawnEnemy() {
    if (gamePaused) return;  // 如果游戏暂停，则不生成敌人

    int startX = rand() % (width() - 50);  // 随机生成敌人的初始x坐标
    enemies.push_back(Enemy(startX, 0));  // 在顶端生成新的敌人
}

// 开始游戏
void GameWindow::startGame() {
    gamePaused = false;
    timer->start();  // 启动游戏定时器
    spawnTimer->start();  // 启动生成敌人的定时器
}

// 暂停游戏
void GameWindow::pauseGame() {
    gamePaused = true;
    timer->stop();  // 停止游戏定时器
    spawnTimer->stop();  // 停止生成敌人的定时器
    update();
}

// 重置游戏
void GameWindow::resetGame() {
    planeX = 400;  // 重置飞机的x坐标
    planeY = 500;  // 重置飞机的y坐标
    left = right = up = down = false;  // 重置方向标志
    score = 0;  // 重置分数
    gamePaused = false;
    enemies.clear();  // 清空敌人列表
    bullets.clear();  // 清空子弹列表
    timer->start();  // 重新启动游戏定时器
    spawnTimer->start();  // 重新启动生成敌人的定时器
    update();
}

// 检查两个矩形是否碰撞
bool GameWindow::checkCollision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2) {
    return !(x2 > x1 + w1 || x2 + w2 < x1 || y2 > y1 + h1 || y2 + h2 < y1);
}
